/**
 * Muntjak-view 的主界面脚本
 * Author John Fang 2018-10-13
 */


//界面组件根路径
var CRT = "/gui";
//用户权限集合
var UFS = {};
//用户风格选择
var UST = "/default";

//登录Token验证，如果没有Token返回登录页面
if(!sessionStorage.getItem("token")){
	$(location).prop("href","/");
}

var logout = function(){
	getData(getWebPath('LOGOUT'));
	UFS={};
	sessionStorage.clear();
	$(location).prop("href","/");
}

/**
 * 通过授权许可获取菜单信息
 */
var getMenuByPermit = function(permit){
	if(permit)
		for(key in UFS){
			if(UFS[key].permit == permit) return UFS[key];
		}
	return null;
}

/**
 * 检查Tabbar中的Tab的总宽度是否超过maindiv宽度，如果超出需要使用Dropdown菜单来容纳。
 * 在createTab或窗口resize后调用此检查。
 */
var chkTabOverflow = function(){
	tab_width = $("#tabbar").innerWidth();
	li_width = tab_width - $("#closeAll").outerWidth();
	compatMenu = $("#moreMenu");
	cmCount = 0;
	if(compatMenu.length==0){
		//compatMenu不存在
		compatMenu = $("<li class=\"dropdown\" id=\"moreMenu\"><a href=\"#\" id=\"compatMenu\" class=\"dropdown-toggle\" data-toggle=\"dropdown\"><span class=\"badge\"></span> <b class=\"caret\"></b></a><ul class=\"dropdown-menu\"  aria-labelledby=\"compatMenu\"></ul></li>");
		li_width = li_width - $("#tabHome").outerWidth(); //取tabHome作为DropDown的宽度
	}else{ 
		cmCount = compatMenu.find("li").length;
		li_width = li_width - compatMenu.outerWidth();
	}
	
	//如果tabbar中的Tab组总的宽度大于maindiv宽度限制将多余的Tab移入compatMenu。
	$("#tabbar>li").each(function(){
		if($(this).attr('id')=='closeAll' || $(this).attr('id')=='moreMenu') return true;
		
		li_width = li_width -$(this).outerWidth();
		if(li_width < 0){ //Tabbar剩余宽度无法满足当前Tab宽度要求。
			if($(this).attr('class')=='active'){
				//如果是当前激活Tab，则Tabbar最后一个Tab进入dropdown，
				$(this).prev().find("a").attr('tabindex',-1);
				$(this).prev().find("a").removeAttr('data-toggle'); //解除数据绑定。
				$(this).prev().attr('ow',$(this).prev().outerWidth());
				$(this).prev().appendTo(compatMenu.find("ul.dropdown-menu")).end();
			}else{
				//将Tab保存到dropdown中。
				$(this).find("a").attr('tabindex',-1);
				$(this).find("a").removeAttr('data-toggle');
				$(this).attr('ow',$(this).outerWidth());//记录Tab的宽度便于恢复Tab时计算所需宽度。
				$(this).appendTo(compatMenu.find("ul.dropdown-menu")).end();
			}
			cmCount++;
		}
		return true;
	});
	if(cmCount>0 && $("#moreMenu").length==0){
		//compatMenu插入Tabbar，位置在closeAll之前。
		$("#closeAll").before(compatMenu);
		$("#moreMenu").on('click','li',function(){reshowTab(this)}); //绑定moreMenu中的事件。
	}
	if(cmCount>0){
		//更新Dropdwon容纳的Tab数量。
		if(cmCount >= 100) 
			$("#compatMenu span.badge").text("99+");
		else
			$("#compatMenu span.badge").text(""+cmCount);
	}
}

/**
 * 检查Tabbar中的compatMenu是否存在Tab，如果存在检查Tabbar中的Tab是否能填满，如果不能填满，则将
 * compatMenu中的Tab移入Tabbar，如果compatMenu不再有多余的Tab，关闭compatMenu。
 * 在closeTab或窗口resize后调用本方法
 */
var chkTabSlack = function(){
	tab_width = $("#tabbar").innerWidth();
	li_width = tab_width;
	compatMenu = $("#moreMenu");
	if(compatMenu.length> 0){
		//检查Tabbar的宽度是否还剩下空位
		$("#tabbar>li").each(function(){
			li_width = li_width -$(this).outerWidth();
			return true;
		});
		//存在空位
		if(li_width > 0){
			//检查空间是否足够容纳恢复的Tab宽度。
			compatMenu.find("li").each(function(){
				li_width = li_width - $(this).attr("ow");
				if(li_width > 0){
					//恢复Tab
					$(this).removeAttr("ow")
					$(this).find("a").removeAttr('tabindex');
					$(this).find("a").attr("data-toggle","tab");//重新绑定Tab
					$("#closeAll").prev().before($(this)).end();
					return true;
				}else
					return false;
			});
			//dorpdown中只剩下一个Tab，移除dorpdown后能有足够宽度显示该Tab
			if($("#moreMenu>ul>li").length==1 &&  li_width + $("#moreMenu").outerWidth()>0){
				
				$("#moreMenu>ul>li").removeAttr("ow")
				$("#moreMenu>ul>li").find("a").removeAttr('tabindex');
				$("#moreMenu>ul>li").find("a").attr("data-toggle","tab"); //重新绑定Tab
				$("#closeAll").before($("#moreMenu>ul>li")).end();
				$("#moreMenu").remove();

			} else if($("#moreMenu>ul>li").length==0) { //dropdown中的全部Tab都恢复回Tabbar，删除dropdown
				$("#moreMenu").remove();
			}else{
				cmCount = $("#moreMenu>ul>li").length;
				if(cmCount >= 100) 
					$("#compatMenu span.badge").text("99+");
				else
					$("#compatMenu span.badge").text(""+cmCount);
			}
		}
	}
}
/**
 * getData中的默认successHandler
 */
var shandler = function(res,status){
	if(status=='success'){
	
		if(res['code'] && (res['code']=='401' || res['code'] == '403')){
				$(location).prop("href","/");
			}
	}else
		$(location).prop("href","/");
}
/**
 * getData中的默认failurehandler
 */
var fhandler = function(res,status,xhr){
			
		if(status != 'success'){
			$(location).prop("href","/");
		}
	}
/**
 * 获取后台数据。
 */
var getData = function(tarurl,data,successhandler,failurehandler){
	
	if(!data){
		data = '';
	}
	if(!successhandler){
		successhandler = shandler;
	}else if(typeof(successhandler) == 'object'){
		//传入的是页面对象
		o = successhandler;
		if(o.val()){
			successhandler = function(res){
				if(res.code==RESP_SUCCESS)
					o.val(res.msg);
			}
		}else{
			successhandler = function(res){
				if(res.code==RESP_SUCCESS)
					o.html(res.msg);
			}
		}
	}else if(typeof(successhandler) != 'function'){
		//传入不是方法
		o = $(successhandler);
		if(o.val()){
			successhandler = function(res){
				if(ires.code==RESP_SUCCESS)
					o.val(res.msg);
			}
		}else{
			successhandler = function(res){
				if(res.code==RESP_SUCCESS)
					o.html(res.msg);
			}
		}
	}
	
	if(!failurehandler){
		failurehandler = fhandler;
	}
	utoken = sessionStorage.getItem("token");
	if(utoken){
		$.ajax({
			url:tarurl,
			contentType:"charset=utf-8",
			dataType:"json",
			data: data,
			beforeSend: function(xhr){xhr.setRequestHeader('AUZ', utoken);},
			success:successhandler,
			failure:failurehandler
		});
	}
	
}
/**
 * 上传文件
 */
var postFile = function(tarurl,files,successhandler,failurehandler){
	
	
}

/**
 * 生成主菜单
 */
 var buildMenu = function(res,status,xhr){
	 if(status!='success'){
		 $(location).prop("href","/");
	 }else{
	 
		for(i=0;i<res.length;i++) {
			UFS[res[i].menuId]={'permit':res[i].permit,'name':res[i].name,'icon':res[i].icon,'url':res[i].url,'component':res[i].component};
			if(res[i].type == '0'){
				$("#leftmenu").append("<div class=\"panel panel-primary\"><div id=\"mn_"+res[i].menuId+"\" class=\"panel-heading\" data-toggle=\"collapse\" data-target=\"#sub_"+res[i].menuId+"\" role=\"tab\"><h4 class=\"panel-title\"><i class=\""+res[i].icon+"\"></i> "+res[i].name+"<span class=\"fa fa-angle-double-down\"></span></h4></div><div id=\"sub_"+res[i].menuId+"\" class=\"panel-collapse collapse\" role=\"tabpanel\" aria-labelledby=\"mn_"+res[i].menuId+"\"><ul class=\"list-group\"></ul></div></div>");
				
			}else if(res[i].type =='1'){
				sub =$("#sub_"+res[i].parentId);
				if(sub.length > 0){
					if($("#sub_"+res[i].parentId+" > ul").length == 0) {
						sub.append("<ul class=\"list-group\"></ul>");
					}
					$("#sub_"+res[i].parentId+" > ul.list-group").append("<li class=\"list-group-item\"><div class=\"menu-item\" mid=\""+res[i].menuId+"\"><i class=\""+res[i].icon+"\"></i> "+res[i].name+"</div></li>");
				}
				
			}
		}
	 }
  }

  

/**
 * 重载主界面。
 */
var reload = function(){
	getData(getWebPath('RELOAD'),'',function(res){
		if(res.data){
			sessionStorage.setItem('sysfunc', JSON.stringify(res.data));
			$(location).prop('href',getWebPath('HOME'));
		}else{
			$(location).prop("href","/");
			$("#passwordrow").after("<div class='alert alert-warning'><ul class='fa-ul'><li><i class='fa fa-exclamation-triangle fa-lg fa-li' aria-hidden='true'></i>界面重载失败，请重新登录。</li></ul></div>");
		}
	});

}

/**
 * 重载布局尺寸，重新计算中间部分的高度和工作窗口的高度。适用于窗口尺寸变化后的
 */  
var layoutResize = function(){
	v_h = $(window).height(); //窗口可视高度
	t_h = $("#topbar").outerHeight(); //topbar高度
	b_h = $("#bottombar").outerHeight(); //bottom高度
	n_h = $("#tabbar").outerHeight(); //导航tabbar高度
	$("#middlebar").height((v_h-t_h-b_h)+"px"); //控制了左边导航菜单高度
	$("#workspace").height((v_h-t_h-b_h-n_h)+"px"); //控制工作窗口高度
 }


/**
 *关闭所有的Tab包括在moreMenu里面的。
 */
var closeAllTab = function(o){
	
	$("#tabbar>li").each(function(i,n){
		if($(n).attr("id") && $(n).attr("id").indexOf("fn_")==0){
			id = $(n).attr("id").substring(3);
			if($("#wp_"+id).length>0)$("#wp_"+id).remove();
			$(n).remove();
		}else if($(n).attr("class")=='dropdown'){
			$(n).find("li").each(function(j,o){
				if($(o).attr("id") && $(o).attr("id").indexOf("fn_")==0){
					id = $(o).attr("id").substring(3);
					if($("#wp_"+id).length>0)$("#wp_"+id).remove();
					$(o).remove();
				}
				return true;
			});
			$(n).remove();
		}
		return true;
	});
	$("#tabHome > a").tab('show');
   }
/**
 * 关闭Tab
 * @param id 菜单Id
 */
 var  closeTab = function(id){
	var newTab = '';
	if($("#fn_"+id).length>0){
		//当前要关闭的Tab正被激活，则其关闭后前一个Tab被激活
		if($("#fn_"+id).attr("class") == 'active'){
			newTab = $("#fn_"+id).prev().find("a");
		}
		$("#fn_"+id).remove().end();
	}
	if($("#wp_"+id).length>0) $("#wp_"+id).remove().end();
	chkTabSlack();
	if(typeof(newTab)=='object') newTab.tab('show');
}
/**
 * 在tabbar中创建Tab
 * @param id 菜单Id
 */   
var createTab = function(id){
		var m = UFS[id];
		if(m){
			if($("#fn_"+id).length==0){
				$("#tabHome").after("<li id=\"fn_"+id+"\"><a href=\"#wp_"+id+"\" data-toggle=\"tab\"><i class=\""+m.icon+"\"></i>"+m.name+"<span class=\"fa fa-times\" mid=\""+id+"\"></span></a></li>");
				_wp = $("<div class=\"tab-pane fade\" id=\"wp_"+id+"\">正在加载"+m.name+"模块。。。</div>");
				$("#workspace").append(_wp);
				if(m.component != null)
					_wp.load(m.component,'',function(){
						$("#wp_"+id).functionBarController(id);
						getData(m.url,'',function(res){$("#wp_"+id).fillListData(res)});
						initList($("#wp_"+id),m.url);});
			}
			$("#fn_"+id+" a").tab('show');
			
			chkTabOverflow();
		}
   }

/**
 * 初始化数据列表页面
 */
var initList = function(_p,dataURL){
	//绑定查询按钮行为
	$(_p).on('click','.searchbtn',function(){
		_p.find("input[name='page']").val("1");
		getData(dataURL,_p.find("div.searchbar form").serialize(),function(res){_p.fillListData(res);});
		_p.find(".searchbar").toggleClass("in");
	});
	//绑定分页按钮行为
	$(_p).on('click','.pagebtn',function(){
		_p.find("input[name='page']").val($(this).attr("page"));
		
		getData(dataURL,_p.find("div.searchbar form").serialize(),function(res){_p.fillListData(res);});
	});
	//绑定全选按钮行为
	$(_p).on('click','.selectAll',function(){
		_p.find("input[name='"+$(this).attr("data-target")+"']").prop('checked',$(this).is(":checked"));
	});
	//输入框组中的textarea的focus/blur效果
	$(".line").on('focus','textarea',function(){$(this).parents(".ta-outline").addClass("fakefocus");});
	$(".line").on('blur','textarea',function(){$(this).parents(".ta-outline").removeClass("fakefocus");});
}

/**
 * Tab从moreMenu中返回tabbar。
 */
var reshowTab = function(obj){
	if($(obj) && $(obj).attr('id')){
		$(obj).find('a').removeAttr("tabindex");
		$(obj).find('a').attr("data-toggle","tab");
		$(obj).removeAttr("os");
		$("#tabbar>li.active").after($(obj)).end();
		$(obj).find('a').tab('show');
		chkTabOverflow();
	}
	
}

/**
 * 加载组件

var loadComponent = function(id){
	if(UFS['id']){
		var cc = new Component({
			baseAnchor: '#wp_'+id,
			webUiPath: UFS['id'].url,
			dataPath: '',
			reqparams: '',
			datahandler: ''
		});
		cc.loaddata();
	}
}
 */

/**
 * 创建分页信息。
 */
var buildPagination = function(p,total,pageSize,page){
	
	p.append($("<div class=\"col-lg-4\">当前符合条件的记录共："+total+"条,目前显示第"+((page-1)*pageSize+1>total? "----":((page-1)*pageSize+1)+"-"+(page*pageSize>total? total:page*pageSize))+"条</div>"));
	var pc = $("<div class=\"col-lg-6\"></div>");
	p.append(pc);
	pc.append($("<span class=\"pagebtn\" page=\"1\"><i class=\"fa fa-angle-double-left\" aria-hidden=\"true\"></i></span>"));
	var pagecount = Math.ceil(total/pageSize);
	bp = 1;
	ep = 9;
	if(page +4 > pagecount){bp = pagecount-8; ep=pagecount;}
	else if(page -4 > bp) {bp = page -4; ep = page+4;}
	if(ep > pagecount) ep = pagecount;
	if(bp<1) bp = 1;
	for(;bp<=ep;bp++){
		pc.append($("<span class=\""+(page==bp? "pageactive":"pagebtn ")+"\" page=\""+bp+"\">"+bp+"</span>"));
	}
	pc.append($("<span class=\"pagebtn\" page=\""+pagecount+"\"><i class=\"fa fa-angle-double-right\" aria-hidden=\"true\"></i></span>"));
	
}

/**
 * 消息窗口
 * @param ： info 消息体 不可为空。
 * @param :  title 标题，可以为空。
 * @param ：closeFunc 关闭时调用的回调函数，可以为空。
 */
var messageBox = function(info,title,closeFunc){
	_mb = $("#msgbox");
	if(title && title!=''){
		_mb.find(".modal-title").html(title).end();
	}
	_mb.find(".modal-body").html(info).end();
	if(closeFunc && typeof(closeFunc)=='function')
		_mb.on('hidden.bs.modal',closeFunc);
	_mb.modal('show');
	$(".modal-backdrop:last").css('z-index',9998); //
}
